package com.bora_bandeco;

import static com.bora_bandeco.CommonUtilities.IREI;
import static com.bora_bandeco.CommonUtilities.NAO_IREI;
import static com.bora_bandeco.CommonUtilities.SEM_RESPOSTA;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class Convite {
	private int id;
	private String restaurante;
	private long horario;
	private Contato anfitriao;
	private String cardapio;
	
	private List<Convidado> convidados;

	
	public Convite() {
		this.id = 0;
		this.restaurante = "";
		this.horario = 0;
		this.anfitriao = null;
		this.cardapio = "";
		this.convidados = new ArrayList<Convidado>();
	}
	
	public Convite(int id) {
		this.id = id;
		SQLiteDatabase db = BoraBandecoProvider.dbHelper.getReadableDatabase();
		
		String[] projection = { "_id", "horario", "restaurante", "anfitriao", "cardapio" };
	    String where =  "_id = " + this.id;
		Cursor cursor = db.query(BoraBandecoProvider.TABELA_CONVITES, projection, where, null, null, null, null, null);
		
		if (cursor != null) {
			cursor.moveToFirst();
			
			if (cursor.getCount() > 0) {
				this.horario = cursor.getLong(cursor.getColumnIndex("horario"));
				this.restaurante = cursor.getString(cursor.getColumnIndex("restaurante"));
				this.anfitriao = new Contato(cursor.getInt(cursor.getColumnIndex("anfitriao")));
				this.cardapio = cursor.getString(cursor.getColumnIndex("cardapio"));
				
				this.convidados = new ArrayList<Convidado>();
				
				cursor.close();
				db.close();
				
				db = BoraBandecoProvider.dbHelper.getReadableDatabase();
				
				String[] projection2 = { "id_convite", "id_contato" };
			    String where2 =  "id_convite = " + this.id;
				cursor = db.query(BoraBandecoProvider.TABELA_R_CONVITES_CONTATOS, projection2, where2, null, null, null, null, null);
				
				cursor.moveToFirst();
				
				for (int i = 0; i < cursor.getCount(); i++) {
					Convidado convidado = new Convidado(cursor.getInt(cursor.getColumnIndex("id_contato")));
					this.convidados.add(convidado);
					cursor.moveToNext();
				}
				
			} else {
				this.restaurante = "";
				this.horario = 0;
				this.anfitriao = null;
				this.cardapio = "";
				this.convidados = new ArrayList<Convidado>();
			}
			
			cursor.close();
		}
		db.close();
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getRestaurante() {
		return restaurante;
	}

	public void setRestaurante(String restaurante) {
		this.restaurante = restaurante;
	}

	public long getHorario() {
		return horario;
	}

	public void setHorario(long horario) {
		this.horario = horario;
	}

	public Contato getAnfitriao() {
		return anfitriao;
	}

	public void setAnfitriao(Contato anfitriao) {
		this.anfitriao = anfitriao;
	}

	public String getCardapio() {
		return cardapio;
	}

	public void setCardapio(String cardapio) {
		this.cardapio = cardapio;
	}

	public List<Convidado> getConvidados() {
		return convidados;
	}

	public void addConvidados(Convidado convidado) {
		this.convidados.add(convidado);
	}
	
	public void salvar() {
		String query = "";
		
		if (this.estaSalvo()) {
			SQLiteDatabase db = BoraBandecoProvider.dbHelper.getWritableDatabase();
			query =
				"UPDATE " + BoraBandecoProvider.TABELA_CONVITES + " SET " +
				"restaurante='" + this.restaurante + "', "+
				"horario='" + this.horario + "', " + 
				"anfitriao='" + this.anfitriao.getId() + "', " + 
				"cardapio='" + this.cardapio + "' " + 
				"WHERE _id='" + this.id + "'";
			System.out.println(query);
			db.execSQL(query);
			db.close();
		} else {
			this.anfitriao.salvar();
			
			SQLiteDatabase db = BoraBandecoProvider.dbHelper.getWritableDatabase();
			query =
				"INSERT INTO " + BoraBandecoProvider.TABELA_CONVITES + " (_id, horario, restaurante, anfitriao, cardapio)  " +
				"SELECT " + this.id + ", '" +
							this.horario + "', '" +
							this.restaurante + "', '" +
							this.anfitriao.getId() + "', '" +
							this.cardapio + "'";
			System.out.println(query);
			db.execSQL(query);
			db.close();
			
			for (Convidado convidado : this.convidados) {
				
				convidado.salvar();
				
				db = BoraBandecoProvider.dbHelper.getWritableDatabase();
				query =
					"INSERT INTO " + BoraBandecoProvider.TABELA_R_CONVITES_CONTATOS + " (id_convite, id_contato, resposta)  " +
					"SELECT " + this.id + ", '" +
								convidado.getId() + "', '" +
								convidado.getResposta() + "'";
				System.out.println(query);
				db.execSQL(query);
				db.close();
			}
		}
	}
	
	public boolean estaSalvo() {
		boolean estaSalvo = true;
		SQLiteDatabase db = BoraBandecoProvider.dbHelper.getReadableDatabase();
		
		String[] projection = { "_id" };
	    String where =  "_id = " + this.id;
		Cursor cursor = db.query(BoraBandecoProvider.TABELA_CONVITES, projection, where, null, null, null, null, null);
		
		if (cursor.getCount() == 0) {
			estaSalvo = false;
		}
		
		cursor.close();
		db.close();
		
		return estaSalvo;
	}
	
	public static List<Convite> getConvitesFuturos() {
		List<Convite> convites = new ArrayList<Convite>();
		
		SQLiteDatabase db = BoraBandecoProvider.dbHelper.getReadableDatabase();
	    String[] projection = { BoraBandecoProvider._ID };
		Date date = new Date();
	    String where =  "horario > " + date.getTime();
	    Cursor cursor = db.query(BoraBandecoProvider.TABELA_CONVITES, projection, where, null, null, null, null, null);
        
		if (cursor != null) {
			cursor.moveToFirst();
			if (cursor.getCount() > 0) {
				int id = cursor.getInt(cursor.getColumnIndex("_id"));
				
				convites.add(new Convite(id));
			}
			cursor.close();
		}
		db.close();
		
		return convites;
	}

	public void confirmarConvidado(int idConvidadoConfirmado, int resposta) {
		SQLiteDatabase db = BoraBandecoProvider.dbHelper.getWritableDatabase();
		String query =
			"UPDATE " + BoraBandecoProvider.TABELA_R_CONVITES_CONTATOS + " SET " + 
			"resposta='" + resposta + "' " + 
			"WHERE id_convite='" + this.id + "' AND " +
			"id_contato='" + idConvidadoConfirmado + "'";
		System.out.println(query);
		db.execSQL(query);
		db.close();
	}
	
	public List<Convidado> getConvidadosIrao() {
		List<Convidado> result = new ArrayList<Convidado>();
		for (Convidado convidado : this.convidados) {
			if (convidado.getResposta() == IREI) {
				result.add(convidado);
			}
		}
		return result;
	}
	
	public List<Convidado> getConvidadosNaoIrao() {
		List<Convidado> result = new ArrayList<Convidado>();
		for (Convidado convidado : this.convidados) {
			if (convidado.getResposta() == NAO_IREI) {
				result.add(convidado);
			}
		}
		return result;
	}
	
	public List<Convidado> getConvidadosSemResposta() {
		List<Convidado> result = new ArrayList<Convidado>();
		for (Convidado convidado : this.convidados) {
			if (convidado.getResposta() == SEM_RESPOSTA) {
				result.add(convidado);
			}
		}
		return result;
	}
	
}
